package basis.netease.hard;

import java.util.Scanner;
import java.util.TreeSet;

/**
 * 7-12 超级回文数
 * 如果一个正整数自身是回文数，而且它也是一个回文数的平方，那么我们称这个数为超级回文数。
 * 现在，给定两个正整数 L 和 R ，请按照从小到大的顺序打印包含在范围 [L, R] 中的所有超级回文数。
 * 注：R包含的数字不超过20位
 * 回文数定义：将该数各个位置的数字反转排列，得到的数和原数一样，例如676，2332，10201。
 * 输入格式:
 * L,R。例如4,1000
 * 输出格式:
 * [L, R]范围内的超级回文数，例如[4, 9, 121, 484]
 * 输入样例:
 * 在这里给出一组输入。例如：
 * 4,1000
 * 输出样例:
 * 以数组的形式打印符合条件的超级回文数，例如：
 * [4, 9, 121, 484]
 */
public class Main_10 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] parts = sc.nextLine().split(",");
        long min = Long.parseLong(parts[0]);
        long max = Long.parseLong(parts[1]);
        TreeSet<Long> results = solve(min, max);
        System.out.println(results);
    }

    static TreeSet<Long> solve(long min, long max) {
        TreeSet<Long> results = new TreeSet<>();
        // 以下为长度等于1位的超级回文数
        if (min <= 1 && 1 <= max) {
            results.add(1L);
        }
        if (min <= 4 && 4 <= max) {
            results.add(4L);
        }
        if (min <= 9 && 9 <= max) {
            results.add(9L);
        }
        // 以下为长度大于1位的超级回文数
        for (int i = 1; i < 100000; i++) {
            String s = Integer.toString(i);
            // 拼接偶数位回文数，由i、反转后的i拼接而成，例：i为123，则拼接后的回文数为123321
            long even = i;
            for (int idx = s.length() - 1; idx >= 0; idx--) {
                even = even * 10 + (s.charAt(idx) - '0');
            }
            long even2 = even * even;
            if (even2 > max) {
                // 已超出最大值限制，直接结束
                break;
            }
            if (min <= even2 && check(even2)) {
                results.add(even2);
            }
            // 拼接奇数位回文数，由i、j、反转后的i拼接而成，例：i为123，则拼接后的回文数为123j321，j为0～9的数
            for (int j = 0; j <= 9; j++) {
                long odd = i * 10 + j;
                for (int idx = s.length() - 1; idx >= 0; idx--) {
                    odd = odd * 10 + (s.charAt(idx) - '0');
                }
                long odd2 = odd * odd;
                if (odd2 > max) {
                    // 已超出最大值限制，直接结束
                    break;
                }
                if (min <= odd2 && check(odd2)) {
                    results.add(odd2);
                }
            }
        }
        return results;
    }

    static boolean check(long n) {
        String s = Long.toString(n);
        int l = 0;
        int r = s.length() - 1;
        while (l < r) {
            if (s.charAt(l) != s.charAt(r)) {
                return false;
            }
            l++;
            r--;
        }
        return true;
    }

}
